home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1998 August: Tool Chest / Dev.CD Aug 98 TC.toast / Sample Code / Snippets / Sound / BufCallback / Source / BufferPlay.c
Encoding:
C/C++ Source or Header  |  1996-09-17  |  6.2 KB  |  268 lines  |  [TEXT/CWIE]

  1. /*______________________________________________________*/
  2. /*                            C Shell                        */
  3. /*                          by                          */
  4. /*                  RICHARD P. COLLYER                  */
  5. /*                       10/14/91                       */
  6. /*______________________________________________________*/
  7.  
  8. #include    <Quickdraw.h>
  9. #include    <Windows.h>
  10. #include    <desk.h>
  11. #include    <Memory.h>
  12. #include    <Menus.h>
  13. #include    <OSEvents.h>
  14. #include    <Resources.h>
  15. #include    <SegLoad.h>
  16. #include    <Sound.h>
  17. #include    <ToolUtils.h>
  18. #include    <Processes.h>
  19.  
  20. #ifdef applec
  21.     extern _DataInit();
  22. #endif
  23.  
  24. #define    TRUE            0xFF
  25. #define    FALSE            0
  26.  
  27. #define    appleID            128            
  28. #define    appleMenu        0
  29. #define    aboutMeCommand    1
  30.  
  31. #define    fileID            129
  32. #define    startCommand    1
  33. #define printCommand    3
  34. #define    quitCommand     5
  35.  
  36. #define    editID            130
  37.  
  38. int                    yieldTime, err;
  39. MenuHandle            mymenu1, mymenu2, mymenu0;
  40. EventRecord         myEvent;
  41. Boolean                DoneFlag;
  42. WindowPtr            whichWindow;
  43. short                GlobalFlag;
  44.  
  45. pascal void CallBack(SndChannelPtr chan, SndCommand cmd);
  46. void start();
  47. void showAboutMeDialog();
  48. void doCommand(long mResult);
  49. void init();
  50.  
  51. /*______________________________________________________*/
  52. /*                What ever You want                    */
  53. /*______________________________________________________*/
  54. pascal void CallBack(SndChannelPtr chan, SndCommand cmd)
  55. {
  56. #pragma unused (chan)
  57. #pragma unused (cmd)
  58.  
  59.   #ifndef powerc
  60.       long    myA5;
  61.       myA5 = SetA5 (cmd.param2);
  62.   #endif
  63.     
  64.     GlobalFlag = TRUE;
  65.    
  66.    #ifndef powerc
  67.       myA5 = SetA5 (myA5);
  68.    #endif
  69.  
  70.     return;
  71. }
  72.     
  73. /*______________________________________________________*/
  74. /*                What ever You want                    */
  75. /*______________________________________________________*/
  76. void start()
  77. {
  78.     Handle            Sound;
  79.     SndChannelPtr    chan;
  80.     SndCommand        mycmd;
  81.     SndCallBackUPP  myCallBackUPP;
  82.     
  83.     GlobalFlag = FALSE;
  84.     
  85.     Sound = GetResource ('snd ', 100);
  86.     if (ResError() != noErr || Sound == nil)
  87.         Debugger();
  88.         
  89.     /* create a UPP for our sound callback */
  90.     myCallBackUPP = NewSndCallBackProc(CallBack);
  91.     
  92.     chan = nil;
  93.     err = SndNewChannel (&chan, sampledSynth, initNoInterp + initMono, myCallBackUPP);
  94.     if (err != noErr)
  95.         Debugger();
  96.     
  97.     do {
  98.         mycmd.cmd = bufferCmd;
  99.         mycmd.param1 = 0;
  100.         mycmd.param2 = (long) *Sound;
  101.         err = SndDoCommand (chan, &mycmd, FALSE);
  102.         if (err != noErr)
  103.             Debugger();
  104.         
  105.         mycmd.cmd = callBackCmd;
  106.         mycmd.param1 = 0;
  107.         mycmd.param2 = SetCurrentA5();
  108.         err = SndDoCommand (chan, &mycmd, FALSE);
  109.         if (err != noErr)
  110.             Debugger();
  111.         
  112.         do{
  113.             }while (GlobalFlag == FALSE);
  114.  
  115.         GlobalFlag = FALSE;
  116.  
  117.         } while (!Button());
  118.         
  119.     err = SndDisposeChannel (chan,FALSE);
  120.     if (err != noErr)
  121.         Debugger();
  122.         
  123.     DisposeRoutineDescriptor(myCallBackUPP);
  124.  
  125.     return;
  126. }
  127.  
  128. /*______________________________________________________*/
  129. /*                 About Prog Dialog                    */
  130. /*______________________________________________________*/
  131. void showAboutMeDialog()
  132. {
  133.     return;
  134. }
  135.  
  136. /*______________________________________________________*/
  137. /*                 Do Menu Function                     */
  138. /*______________________________________________________*/
  139. void doCommand(mResult)
  140.     long    mResult;
  141. {
  142.     int                     theMenu, theItem;
  143.     Str255                    daName;
  144.     GrafPtr                 savePort;
  145.  
  146.     theItem = LoWord(mResult);
  147.     theMenu = HiWord(mResult);
  148.     
  149.     switch (theMenu) {
  150. /*______________________________________________________*/
  151. /*                    Do Apple Menu                     */
  152. /*______________________________________________________*/
  153.         case appleID:
  154.             if (theItem == aboutMeCommand)
  155.                 showAboutMeDialog();
  156.             else {
  157.                 GetMenuItemText(mymenu0, theItem, daName);
  158.                 GetPort(&savePort);
  159.                 (void) OpenDeskAcc((ConstStr255Param)daName);
  160.                 SetPort(savePort);
  161.             }
  162.             break;
  163. /*______________________________________________________*/
  164. /*                     Do File Menu                     */
  165. /*______________________________________________________*/
  166.         case fileID:
  167.             switch (theItem) {
  168.                 case startCommand:
  169.                     start();
  170.                     break;
  171.                 case printCommand:
  172.                     break;
  173.                 case quitCommand:
  174.                     DoneFlag = TRUE;
  175.                     break;
  176.                 default:
  177.                     break;
  178.                 }
  179.             break;
  180. /*______________________________________________________*/
  181. /*                     Do Edit Menu                     */
  182. /*______________________________________________________*/
  183.         case editID:
  184.             switch (theItem) {
  185.                 default:
  186.                     break;
  187.                 }
  188.             break;
  189.         default:
  190.             break;
  191.         }
  192.     HiliteMenu(0);
  193.     return;
  194. }
  195.  
  196. /*______________________________________________________*/
  197. /*               Initialization traps                   */
  198. /*______________________________________________________*/
  199. void init()
  200. {
  201.     #ifdef applec
  202.         UnloadSeg(_DataInit);
  203.     #endif
  204.         
  205.     InitGraf(&qd.thePort);
  206.     FlushEvents(everyEvent, 0);
  207.     InitMenus();
  208.     InitCursor();
  209.     MaxApplZone();
  210. /*______________________________________________________*/
  211. /*                    Set menus                         */
  212. /*______________________________________________________*/
  213.     mymenu0 = GetMenu(appleID);
  214.     AppendResMenu(mymenu0, 'DRVR');
  215.     InsertMenu(mymenu0,0);
  216.     mymenu1 = NewMenu(129,(ConstStr255Param)"\pFile");
  217.     AppendMenu(mymenu1,(ConstStr255Param)"\pStart;-;\Print;-;\Quit");
  218.     InsertMenu(mymenu1,0);
  219.     mymenu2 = NewMenu(130,(ConstStr255Param)"\pEdit");
  220.     InsertMenu(mymenu2,0);
  221.     DrawMenuBar();
  222.  
  223. /*______________________________________________________*/
  224. /*                  Init variables                      */
  225. /*______________________________________________________*/
  226.     DoneFlag = FALSE;
  227.     yieldTime = 0;
  228.     return;
  229. }
  230.  
  231. main()
  232. {
  233. /*______________________________________________________*/
  234. /*                   Main Event loop                    */
  235. /*______________________________________________________*/
  236.     init();
  237.     for ( ;; ) {
  238.         if (DoneFlag) {
  239.             ExitToShell();
  240.             }
  241.         if (WaitNextEvent(everyEvent, &myEvent, yieldTime, nil)) {
  242.             switch (myEvent.what) {
  243.                 case mouseDown:
  244.                     switch (FindWindow(myEvent.where, &whichWindow)) {
  245.                         case inSysWindow:
  246.                             SystemClick(&myEvent, whichWindow);
  247.                             break;
  248.                         case inMenuBar:
  249.                             doCommand(MenuSelect(myEvent.where));
  250.                             break;
  251.                         default:
  252.                             break;
  253.                         }
  254.                     break;
  255.                 case 15:
  256.                     if ((myEvent.message << 31) == 0) { /* Suspend */
  257.                         yieldTime = 30;
  258.                         }
  259.                     else { /* Resume */
  260.                         yieldTime = 0;
  261.                         }
  262.                     break;
  263.                 default:
  264.                     break;
  265.                 }
  266.             }
  267.         }
  268. }